package sys

/*******************************************************************************
Copyright:cloud
Author:cloudapex@126.com
Version:1.0
Date:2020-06-12
Description: 角色相关接口
*******************************************************************************/
import (
	"permissions/api/cache"
	"permissions/model"

	"gitee.com/cloudapex/ulern/htp"
	"gitee.com/cloudapex/ulern/util"
	"github.com/gin-gonic/gin"
)

/*
 * 描述: 角色列表
 * 路由: /role/list
 * 方法: GET
 *********************************************************************/
type RoleList struct {
	model.SortFinder
	model.PageFinder
	Name   string `form:"name" binding:"omitempty,max=64"`    // 角色名
	State  int    `form:"state" binding:"omitempty"`          // 状态(1:正常;2:失效)
	Remark string `form:"remark" binding:"omitempty,max=128"` // 备注
}

func (this *RoleList) Handle(c *gin.Context) htp.Response {
	//user := comm.CurrUser(c)

	total, items, err := (&model.Role{
		Name:   this.Name,
		State:  this.State,
		Remark: this.Remark,
		Sorte:  this.SortFinder,
		Pager:  this.PageFinder,
	}).Find()
	if err != nil {
		return htp.RespDBErr("", err)
	}
	return htp.RespOK("", &struct {
		Total int          `json:"total"` // 总记录条数
		List  []model.Role `json:"list"`  // 列表
	}{total, items})
}

/*
 * 描述: 角色简表
 * 路由: /role/labs
 * 方法: GET
 *********************************************************************/
type RoleLabs struct {
	Name  string `form:"name" binding:"omitempty,max=64"` // 角色名
	State int    `form:"state" binding:"omitempty"`       // 状态(1:正常;2:失效)
}

func (this *RoleLabs) Handle(c *gin.Context) htp.Response {
	//user := comm.CurrUser(c)

	items, err := (&model.Role{
		Name:  this.Name,
		State: this.State,
	}).FindLabs()
	if err != nil {
		return htp.RespDBErr("", err)
	}
	return htp.RespOK("", &struct {
		List []model.RoleLable `json:"list"` // 列表
	}{items})
}

/*
 * 描述: 新增角色
 * 路由: /role/add
 * 方法: POST
 *********************************************************************/
type RoleAdd struct {
	Name   string `form:"name" json:"name" binding:"required,max=64"`       // 角色名
	Order  int    `form:"order" json:"order" binding:"omitempty"`           // 排序值
	State  int    `form:"state" json:"state" binding:"required"`            // 状态(1:正常;2:失效)
	Remark string `form:"remark" json:"remark" binding:"omitempty,max=128"` // 备注
}

func (this *RoleAdd) Handle(c *gin.Context) htp.Response {
	//user := comm.CurrUser(c)

	m := model.Role{
		Name:   this.Name,
		Order:  this.Order,
		State:  this.State,
		Remark: this.Remark,
	}
	if _, err := m.Create(); err != nil {
		return htp.RespDBErr("", err)
	}
	return htp.RespOK("", &struct {
		Id int64 `json:"id"` // 角色Id
	}{m.Id})
}

/*
 * 描述: 编辑角色
 * 路由: /role/upd
 * 方法: POST
 *********************************************************************/
type RoleUpd struct {
	Id     int64  `form:"id" json:"id" binding:"required"`                  // 角色Id
	Name   string `form:"name" json:"name" binding:"required,max=64"`       // 角色名
	Order  int    `form:"order" json:"order" binding:"omitempty"`           // 排序值
	State  int    `form:"state" json:"state" binding:"required"`            // 状态(1:正常;2:失效)
	Remark string `form:"remark" json:"remark" binding:"omitempty,max=128"` // 备注
}

func (this *RoleUpd) Handle(c *gin.Context) htp.Response {
	//user := comm.CurrUser(c)

	m := model.Role{
		Id:     this.Id,
		Name:   this.Name,
		Order:  this.Order,
		State:  this.State,
		Remark: this.Remark,
	}
	// 更新记录, 允许后面的几个字段被重置为默认值
	if _, err := m.Update(this.Id, "order", "remark"); err != nil {
		return htp.RespDBErr("", err)
	}
	return htp.RespOK("", nil)
}

/*
 * 描述: 删除角色
 * 路由: /role/del
 * 方法: POST
 *********************************************************************/
type RoleDel struct {
	Id int64 `form:"id" json:"id" binding:"required"` // 权限Id
}

func (this *RoleDel) Handle(c *gin.Context) htp.Response {
	//user := comm.CurrUser(c)

	eff, err := (&model.Role{}).Delete(this.Id)
	if err != nil {
		return htp.RespDBErr("", err)
	}
	if eff == 0 {
		return htp.RespErr(htp.CodeTargetNotFound, "此角色不存在", nil)
	}

	if _, err := (&model.RolePower{}).Delete(this.Id, 0); err != nil {
		return htp.RespDBErr("", err)
	}
	return htp.RespOK("", nil)
}

/*
 * 描述: 获取角色权限Ids
 * 路由: /role/choice
 * 方法: GET
 *********************************************************************/
type RoleChoice struct {
	Id int64 `form:"id" binding:"required"` // 角色Id
}

func (this *RoleChoice) Handle(c *gin.Context) htp.Response {
	//user := comm.CurrUser(c)

	ids, err := (&model.RolePower{RoleId: this.Id}).FindIds()
	if err != nil {
		return htp.RespDBErr("", err)
	}
	return htp.RespOK("", &struct {
		Ids []int64 `json:"ids"` // 权限Ids
	}{ids})
}

/*
 * 描述: 修改角色权限Ids
 * 路由: /role/choose
 * 方法: POST
 *********************************************************************/
type RoleChoose struct {
	RId  int64   `form:"rid" json:"rid" binding:"required"`    // 角色Id
	PIds []int64 `form:"pids" json:"pids" binding:"omitempty"` // 权限Ids
}

func (this *RoleChoose) Handle(c *gin.Context) htp.Response {
	//user := comm.CurrUser(c)

	if has, err := (&model.Role{Id: this.RId}).Load(); !has || err != nil {
		return htp.RespDBErr("此角色不存在", err)
	}
	if vry, err := (&model.Power{}).VerifyIds(this.PIds); !vry || err != nil {
		return htp.RespDBErr("权限验证失败", err)
	}

	// 更新角色与权限的关联
	m := model.RolePower{}
	if _, err := m.Delete(this.RId, 0); err != nil {
		return htp.RespDBErr("角色权限操作失败", err)
	}
	if err := m.Insert(this.RId, this.PIds); err != nil {
		return htp.RespDBErr("角色权限更新失败", err)
	}

	util.Goroutine("HandRouteRoles", func() { // 更新路由角色缓存
		if err := cache.HandRouteRoles(this.PIds); err != nil {
			util.Error("RoleChoose.HandRouteRoles err:%v", err)
		}
	})
	return htp.RespOK("", nil)
}
